注意:所有文章除特别说明外,转载请注明出处.
[TOC]
第三章 线程间通信
3.1 等待/通知机制
3.1.3 等待/通知机制的实现
wait()方法是使当前执行程序的线程进入等待状态,wait()方法是Object类方法,该方法用来将当前线程置入“预执行队列”中。
如果在使用该方法前没有 同步加锁 将会弹出异常 Exception in thread “main” java.lang.IllegalMonitorStateException 。
提示:只能在同步方法或同步块中调用wait()方法,在执行wait()方法后,当前线程释放锁。
notify()方法也要在同步块或同步方法中调用,在调用前需要获得该对象的对象级别锁。
提示:该方法是用来提示那些可能等待该对象的对象锁的其它线程,如果有多个线程等待,则由线程规划器随机挑选出其中一个呈wait()状态的线程,对其发出通知notify(),并使它等待获取该对象的对象锁。
注意:在执行notify()方法之后,不会立即获取该对象锁,要等到执行notify()的线程将程序执行完之后,退出synchronize块之后释放锁。
总结:wait()使线程停止运行,notify()使停止的线程继续执行。
关键字synchronize可以将任何一个Object对象作为同步对象看待,而Java为每个Object对象都实现了wait()方法和notify()方法,它们必须用在被 synchronize 同步的Object临界区内。
通过wait()方法可以使处于临界区内的线程进入等待状态,同时释放被同步对象的锁。notify()方法可以唤醒一个因调用了wait()操作处于阻塞状态的线程,使其进入就绪状态。
3.1.4 wait()方法锁释放 | notify()方法锁不释放
当方法wait()被执行后,锁被自动释放,但执行完notify()方法后,锁不自动释放。
提示:必须执行完notify()方法所在的同步synchronize代码块之后才释放锁。
3.1.5 interrupt()方法遇到wait()方法
当线程处于wait()状态时,调用线程对象的 interrupt()方法会出现 InterruptedException 异常。
3.2 方法join使用
方法join()的作用是:使所属的线程对象x正常执行run()方法中的任务,而使当前线程z进行无限期的阻塞,等待线程x销毁后再继续执行线程z后面的程序。
方法join()具有使线程排队运行的作用,有些类似同步的运行效果。join()方法与synchronize的区别是:join在内部使用wait()方法进行等待,而synchronize关键字使用的是“对象监视器”原理作为同步。
3.3 类ThreadLocal使用
类ThreadLocal主要解决每个线程绑定自己的值,可以将ThreadLocal类比喻成全局存放数据的盒子,盒子中可以存储每个线程的私有数据。
提示:类ThreadLocal解决的是变量在不同线程间的隔离性,即就是不同线程拥有自己的值,不同线程的值可以放入 ThreadLocal 类中进行保存。
3.3.2 验证线程变量的隔离性
3.4 类InheritableThreadLocal的使用
使用类 InheritableThreadLocal 可以在子线程中取得父线程继承下来的值。